import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial.chebyshev import Chebyshev

# 1. 定义原函数（模拟图中阶跃行为）
def original_func(x):
    return np.where(x < 0.4, 0.2, 0.8)  # x<0.4时为0.2，x≥0.4时为0.8

# 2. 定义域：与图一致（0到0.8）
x = np.linspace(0, 0.8, 200)
y_original = original_func(x)

# 3. 切比雪夫近似（将定义域映射到切比雪夫的[-1,1]区间）
def chebyshev_approx(x, y, order):
    # 映射x到[-1,1]区间
    x_scaled = 2 * (x - x.min()) / (x.max() - x.min()) - 1
    # 拟合切比雪夫多项式
    cheb_poly = Chebyshev.fit(x_scaled, y, deg=order)
    # 还原到原定义域并计算近似值
    print(cheb_poly)
    return cheb_poly(x_scaled)

# 计算10阶、40阶近似
y_10order = chebyshev_approx(x, y_original, order=10)
y_40order = chebyshev_approx(x, y_original, order=40)

# 4. 绘图（还原原图风格）
plt.figure(figsize=(8, 6))
plt.plot(x, y_original, 'k-', label='Original function')
plt.plot(x, y_10order, 'gray',linestyle='--', label='10th order')
plt.plot(x, y_40order, 'gray',linestyle=':', label='40th order')
plt.xlim(0, 0.8)
plt.ylim(0.1, 0.9)
plt.grid(True)
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()